package com.xbb.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xbb.entity.Module;
import com.xbb.entity.Rolemodules;
import com.xbb.mapper.ModuleMapper;
import com.xbb.mapper.RolemodulesMapper;
import com.xbb.service.IModuleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Mr xie
 * @since 2020-05-19
 */
@Service
public class ModuleServiceImpl extends ServiceImpl<ModuleMapper, Module> implements IModuleService {

    @Autowired
    ModuleMapper moduleMapper;

    @Autowired
    RolemodulesMapper rolemodulesMapper;

    List<Integer> moduleIds =null;

    @Override
    public List<Module> getModuleTree() {
        moduleIds =null;
        //声明一个集合存储最终结果
        List<Module> tree = new ArrayList<>();
        //全查所有模块
        List<Module> list = moduleMapper.selectList(new QueryWrapper<Module>().orderByDesc("weight"));
        //遍历，判断是否为根节点，如果是，则加入到树中，同时给这个父节点找孩子，设置子节点
        for (Module m : list){
            if (m.getParentId()!=null && m.getParentId()==0){
                tree.add(findChildren(m,list));
            }
        }
        return tree;
    }

    @Override
    public List<Module> getModuleTreeByRoleId(Integer roleId) {
        //声明一个集合存储指定角色对应模块的id
        moduleIds = rolemodulesMapper.getModuleTreeByRoleId(roleId);
        //声明一个集合存储最终结果
        List<Module> tree = new ArrayList<>();
        //全查所有模块
        List<Module> list = moduleMapper.selectList(null);
        //遍历，判断是否为根节点，如果是，则加入到树中，同时给这个父节点找孩子，设置子节点
        for (Module m : list){
            if (m.getParentId()!=null && m.getParentId()==0){
                tree.add(findChildren(m,list));
            }
        }
        //设置父节点为false
        for (Module mo : tree){
            mo.setChecked(false);
        }
        return tree;
    }

    @Override
    public List<Module> getModuleTreeByUserId(Integer uid) {
        moduleIds =null;
        //声明一个集合存储最终结果
        List<Module> tree = new ArrayList<>();
        //全查所有模块
        //List<Module> list = moduleMapper.selectList(null);
        //遍历，判断是否为根节点，如果是，则加入到树中，同时给这个父节点找孩子，设置子节点
        //获取用户拥有的模块集合
        List<Module> list =rolemodulesMapper.getModuleTreeByUserId(uid);
        for (Module m : list){
            if (m.getParentId()!=null && m.getParentId()==0){
                tree.add(findChildren(m,list));
            }
        }
        return tree;
    }

    @Override
    public Module getModuleByModId(Integer id) {
        return moduleMapper.getModuleByModId(id);
    }

    @Override
    public List<Module> getModueles(Module module) {
        return moduleMapper.getModueles(module);
    }

    @Override
    public List<Rolemodules> getModContainsRoles(Integer id) {
        return moduleMapper.getModContainsRoles(id);
    }

    //递归思想查询子模块
    private Module findChildren(Module m, List<Module> list) {
        for (Module item : list) {
            if (moduleIds!=null && moduleIds.contains(item.getId())) {
                item.setChecked(true);
            }
            //找孩子
            if (m.getId() == item.getParentId()) {
                if (m.getChildren() == null) {
                    m.setChildren(new ArrayList<Module>());
                }
                m.getChildren().add(findChildren(item, list));
            }
        }
        return m;
    }
}
